{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 房价预测案例\n",
    "\n",
    "## Step 1: 检视源数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读入数据\n",
    "\n",
    "* 一般来说源数据的index那一栏没什么用，我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。\n",
    "\n",
    "* 有人的地方就有鄙视链。跟知乎一样。Kaggle的也是个处处呵呵的危险地带。Kaggle上默认把数据放在*input*文件夹下。所以我们没事儿写个教程什么的，也可以依据这个convention来，显得自己很有逼格。。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train_df = pd.read_csv('../input/train.csv', index_col=0)\n",
    "test_df = pd.read_csv('../input/test.csv', index_col=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 检视源数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MSSubClass</th>\n",
       "      <th>MSZoning</th>\n",
       "      <th>LotFrontage</th>\n",
       "      <th>LotArea</th>\n",
       "      <th>Street</th>\n",
       "      <th>Alley</th>\n",
       "      <th>LotShape</th>\n",
       "      <th>LandContour</th>\n",
       "      <th>Utilities</th>\n",
       "      <th>LotConfig</th>\n",
       "      <th>...</th>\n",
       "      <th>PoolArea</th>\n",
       "      <th>PoolQC</th>\n",
       "      <th>Fence</th>\n",
       "      <th>MiscFeature</th>\n",
       "      <th>MiscVal</th>\n",
       "      <th>MoSold</th>\n",
       "      <th>YrSold</th>\n",
       "      <th>SaleType</th>\n",
       "      <th>SaleCondition</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>65.0</td>\n",
       "      <td>8450</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Inside</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>208500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>80.0</td>\n",
       "      <td>9600</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>FR2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2007</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>181500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>68.0</td>\n",
       "      <td>11250</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Inside</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>223500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>70</td>\n",
       "      <td>RL</td>\n",
       "      <td>60.0</td>\n",
       "      <td>9550</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>Corner</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2006</td>\n",
       "      <td>WD</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>140000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>84.0</td>\n",
       "      <td>14260</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>FR2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>250000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 80 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \\\n",
       "Id                                                                    \n",
       "1           60       RL         65.0     8450   Pave   NaN      Reg   \n",
       "2           20       RL         80.0     9600   Pave   NaN      Reg   \n",
       "3           60       RL         68.0    11250   Pave   NaN      IR1   \n",
       "4           70       RL         60.0     9550   Pave   NaN      IR1   \n",
       "5           60       RL         84.0    14260   Pave   NaN      IR1   \n",
       "\n",
       "   LandContour Utilities LotConfig  ... PoolArea PoolQC Fence MiscFeature  \\\n",
       "Id                                  ...                                     \n",
       "1          Lvl    AllPub    Inside  ...        0    NaN   NaN         NaN   \n",
       "2          Lvl    AllPub       FR2  ...        0    NaN   NaN         NaN   \n",
       "3          Lvl    AllPub    Inside  ...        0    NaN   NaN         NaN   \n",
       "4          Lvl    AllPub    Corner  ...        0    NaN   NaN         NaN   \n",
       "5          Lvl    AllPub       FR2  ...        0    NaN   NaN         NaN   \n",
       "\n",
       "   MiscVal MoSold  YrSold  SaleType  SaleCondition  SalePrice  \n",
       "Id                                                             \n",
       "1        0      2    2008        WD         Normal     208500  \n",
       "2        0      5    2007        WD         Normal     181500  \n",
       "3        0      9    2008        WD         Normal     223500  \n",
       "4        0      2    2006        WD        Abnorml     140000  \n",
       "5        0     12    2008        WD         Normal     250000  \n",
       "\n",
       "[5 rows x 80 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这时候大概心里可以有数，哪些地方需要人为的处理一下，以做到源数据更加好被process。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: 合并数据\n",
    "\n",
    "这么做主要是为了用DF进行数据预处理的时候更加方便。等所有的需要的预处理进行完之后，我们再把他们分隔开。\n",
    "\n",
    "首先，SalePrice作为我们的训练目标，只会出现在训练集中，不会在测试集中（要不然你测试什么？）。所以，我们先把*SalePrice*这一列给拿出来，不让它碍事儿。\n",
    "\n",
    "我们先看一下*SalePrice*长什么样纸："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<Axes: title={'center': 'price'}>,\n",
       "        <Axes: title={'center': 'log(price + 1)'}>]], dtype=object)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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XfsmdsH+/fulF/l///33uHjxIl544QUAwD333IN77rlHmltZWYlz585h8uTJvVaf7DjwDiKSOcttxsePHxf/9V//Jfr27Sv69esnsrKyrG7rAyB0Ol2Ha+CK24yFEOLbb78VM2fOFAMGDBAqlUrcfPPNQqfTCaPRKM05f/68yMnJEUOGDBFKpVL0799f3HHHHeLll18WLS0tPdIvkau68hZdi9dff11ERkYKhUIhNBqNyMzMFD/99FO7569atUqEh4cLlUolxo4dKz777DMRExMjJk2aZDXv888/FwDEJ598YjUeHh4uUlNTxa5du8SoUaOESqUSkZGRori4uMM6O3obgqv18OGHH4o77rhDeHt7C7VaLcaOHSv++te/Ws05cuSImDp1qggMDBQqlUqEh4eLadOmidLS0ut859rrzm3GlmNqR19XHicXLlwowsLCrG6PvtG4CXGVl1zTDc/yRk7ff/89z1gQkcRsNmPAgAGYOnUq3nrrLattEydOREhICP7yl79IY4MHD8aIESOwbdu23i7VKRmNRgwePBjPPfccnnnmGUeX4zB8DQoREV3VpUuX2t06vGHDBpw7d67DT+N96aWX8N5770m3KJPtCgsLoVAo8NRTTzm6FIfia1CIiOiqysvLMX/+fDz88MMIDAzE559/jnXr1mHEiBF4+OGH282Pi4uz+lwtst1TTz11w4cTgAGFiIiuYfDgwQgNDcWqVatw7tw5BAQEYObMmVixYgWUSqWjyyMXxtegEBERkezwNShEREQkOwwoREREJDtO+RoUs9mMM2fOoG/fvjfshygR9RQhBM6fP4+QkBCrT7q9UfD4QtRzbDm+OGVAOXPmDEJDQx1dBpFL++677zBo0CBHl9HreHwh6nmdOb44ZUDp27cvgF/egj0gIMDB1diXyWRCSUkJkpKSoFAoHF2O3bhqX4Dr9dbU1ITQ0FDp79mNxtL3d999B7Va7eBqOsfV/gza4kbuHXC+/m05vjhlQLGcdu3bt6/THEA6y2QywcfHB2q12in+sHWWq/YFuG5vN+rlDUvfarXaaY4vrvpnsDNu5N4B5+2/M8eXG+8CMxEREckeAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJjqejC3A2g5/bbre1Tq1ItdtaRETOxF7HUpWHQP5YuyxFMsMzKERERCQ7DChEREQkOwwoREREJDsMKERERCQ7DChEREQkOwwoREREJDsMKERERCQ7NgWUwYMHw83Nrd2XTqcDAFy6dAk6nQ6BgYHo06cP0tLSUFdXZ7VGbW0tUlNT4ePjg6CgICxYsACtra3264iIiIicnk0BpaKiAmfPnpW+9Ho9AODhhx8GAMyfPx9bt25FcXEx9u3bhzNnzmDq1KnS89va2pCamoqWlhYcOHAA69evR1FRERYvXmzHloiIiMjZ2fROsgMGDLB6vGLFCtxyyy0YN24cGhsbsW7dOmzcuBETJkwAABQWFmLYsGEoLy9HfHw8SkpKcPz4cezevRsajQbR0dFYvnw5Fi5ciNzcXCiVyg73azQaYTQapcdNTU0AAJPJBJPJZFPD3aXyEHZbq6PaLWO93VdPc9W+ANfrzVX6ICLn1uW3um9pacE777yD7OxsuLm5obKyEiaTCQkJCdKcyMhIhIWFoaysDPHx8SgrK8PIkSOh0WikOcnJycjMzMSxY8cwevToDveVl5eHpUuXthvfu3cvfHx8utpCl9jzLZV37Nhx1W2Ws1OuxlX7Alynt+bmZkeXQETU9YCyZcsWNDQ04IknngAAGAwGKJVK+Pv7W83TaDQwGAzSnMvDiWW7ZdvV5OTkIDs7W3rc1NSE0NBQjB8/HoGBgV1toUtG5O6y21rVucntxkwmE/R6PRITE6FQKOy2L0dz1b4A1+vNcoaSiMiRuhxQ1q1bh5SUFISEhNizng6pVCqoVKp24wqFotd/IRjb3Oy21rVqd0RvvcFV+wJcpzdX6IGInF+XbjP+9ttvsXv3bvzmN7+RxoKDg9HS0oKGhgaruXV1dQgODpbmXHlXj+WxZQ4RERFRlwJKYWEhgoKCkJqaKo3FxMRAoVCgtLRUGqupqUFtbS20Wi0AQKvV4ujRo6ivr5fm6PV6qNVqREVFdbUHIiIicjE2X+Ixm80oLCxERkYGPD3/83Q/Pz/MmjUL2dnZCAgIgFqtxty5c6HVahEfHw8ASEpKQlRUFGbMmIH8/HwYDAYsWrQIOp2uw0s4REREdGOyOaDs3r0btbW1+PWvf91u28qVK+Hu7o60tDQYjUYkJydj9erV0nYPDw9s27YNmZmZ0Gq18PX1RUZGBpYtW9a9LoiIiMil2BxQkpKSIETH7wXi5eWFgoICFBQUXPX54eHh17y9loiIiIifxUNERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJERESyw4BCREREssOAQkRERLLDgEJEsrRixQq4ublh3rx50tilS5eg0+kQGBiIPn36IC0tDXV1dVbPq62tRWpqKnx8fBAUFIQFCxagtbW1l6snou5iQCEi2amoqMAbb7yBUaNGWY3Pnz8fW7duRXFxMfbt24czZ85g6tSp0va2tjakpqaipaUFBw4cwPr161FUVITFixf3dgtE1E0MKEQkKxcuXEB6ejreeust9OvXTxpvbGzEunXr8Morr2DChAmIiYlBYWEhDhw4gPLycgBASUkJjh8/jnfeeQfR0dFISUnB8uXLUVBQgJaWFke1RERd4OnoAoiILqfT6ZCamoqEhAS88MIL0nhlZSVMJhMSEhKkscjISISFhaGsrAzx8fEoKyvDyJEjodFopDnJycnIzMzEsWPHMHr06Hb7MxqNMBqN0uOmpiYAgMlkgslk6okW7c5Sp7PUCwAqD2Gfddx/WceZercnZ/vZ21InAwoRycamTZvw+eefo6Kiot02g8EApVIJf39/q3GNRgODwSDNuTycWLZbtnUkLy8PS5cubTdeUlICHx+frrThMHq93tEldFr+WPuu50y99wRn6b+5ubnTcxlQiEgWvvvuOzzzzDPQ6/Xw8vLqtf3m5OQgOztbetzU1ITQ0FAkJSVBrVb3Wh3dYTKZoNfrkZiYCIVC4ehyOmVE7i67rKNyF1gea8bzh91hNLvZZc3q3GS7rNMbnO1nbzlD2RkMKEQkC5WVlaivr8ftt98ujbW1tWH//v14/fXXsWvXLrS0tKChocHqLEpdXR2Cg4MBAMHBwTh06JDVupa7fCxzrqRSqaBSqdqNKxQKpzjgX86Zaja22SdMSOuZ3ey2prN8Dy/nLD97W2q0+UWyp0+fxuOPP47AwEB4e3tj5MiROHz4sLRdCIHFixdj4MCB8Pb2RkJCAk6cOGG1xrlz55Ceng61Wg1/f3/MmjULFy5csLUUInIhEydOxNGjR1FVVSV9xcbGIj09Xfp/hUKB0tJS6Tk1NTWora2FVqsFAGi1Whw9ehT19fXSHL1eD7VajaioqF7viYi6zqYzKD/99BPuvPNOjB8/Hh999BEGDBiAEydOWL3SPj8/H6tWrcL69esRERGB559/HsnJyTh+/Lh02jY9PR1nz56FXq+HyWTCk08+iTlz5mDjxo327Y6InEbfvn0xYsQIqzFfX18EBgZK47NmzUJ2djYCAgKgVqsxd+5caLVaxMfHAwCSkpIQFRWFGTNmID8/HwaDAYsWLYJOp+vwLAkRyZdNAeWPf/wjQkNDUVhYKI1FRERI/y+EwKuvvopFixZh8uTJAIANGzZAo9Fgy5YtmD59Or788kvs3LkTFRUViI2NBQC89tpruO+++/Dyyy8jJCTEHn0RkQtauXIl3N3dkZaWBqPRiOTkZKxevVra7uHhgW3btiEzMxNarRa+vr7IyMjAsmXLHFg1EXWFTQHlww8/RHJyMh5++GHs27cPN910E55++mnMnj0bAHDy5EkYDAar2wD9/PwQFxeHsrIyTJ8+HWVlZfD395fCCQAkJCTA3d0dBw8exEMPPdRuv3K6DdBet8YBHd9u5Wy3jHWWq/YFuF5vcurj448/tnrs5eWFgoICFBQUXPU54eHh2LFjRw9XRkQ9zaaA8s0332DNmjXIzs7G//zP/6CiogK/+93voFQqkZGRId3G19FtfpffBhgUFGRdhKcnAgICbL4NcO/evb1+G6A9b4271kHUWW4Zs5Wr9gW4Tm+23AZIRNRTbAooZrMZsbGxeOmllwAAo0ePRnV1NdauXYuMjIweKRC4+m2A48ePR2BgYI/ttyP2ujUO6PhWNme7ZayzXLUvwPV6s+U2QCKinmJTQBk4cGC7V8IPGzYMf//73wH85za+uro6DBw4UJpTV1eH6Ohoac7lr7AHgNbWVpw7d84pbgO0561x16rdWW4Zs5Wr9gW4Tm+u0AMROT+bbjO+8847UVNTYzX21VdfITw8HMAvL5gNDg62ug2wqakJBw8etLoNsKGhAZWVldKcPXv2wGw2Iy4ursuNEBERkeuw6QzK/Pnzcccdd+Cll17CtGnTcOjQIbz55pt48803AUD6aPQXXngBQ4cOlW4zDgkJwZQpUwD8csZl0qRJmD17NtauXQuTyYSsrCxMnz6dd/AQERERABsDypgxY7B582bk5ORg2bJliIiIwKuvvor09HRpzrPPPouLFy9izpw5aGhowF133YWdO3davXX1u+++i6ysLEycOFG6ZXDVqlX264qIiIicms1vdX///ffj/vvvv+p2Nzc3LFu27JrvOxAQEMA3ZSMiIqKrsvmt7omIiIh6GgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyQ4DChEREckOAwoRERHJDgMKERERyY5NASU3Nxdubm5WX5GRkdL2S5cuQafTITAwEH369EFaWhrq6uqs1qitrUVqaip8fHwQFBSEBQsWoLW11T7dEBERkUvwtPUJw4cPx+7du/+zgOd/lpg/fz62b9+O4uJi+Pn5ISsrC1OnTsVnn30GAGhra0NqaiqCg4Nx4MABnD17FjNnzoRCocBLL71kh3aIiIjIFdgcUDw9PREcHNxuvLGxEevWrcPGjRsxYcIEAEBhYSGGDRuG8vJyxMfHo6SkBMePH8fu3buh0WgQHR2N5cuXY+HChcjNzYVSqex+R0REROT0bA4oJ06cQEhICLy8vKDVapGXl4ewsDBUVlbCZDIhISFBmhsZGYmwsDCUlZUhPj4eZWVlGDlyJDQajTQnOTkZmZmZOHbsGEaPHt3hPo1GI4xGo/S4qakJAGAymWAymWxtoVtUHsJua3VUu2Wst/vqaa7aF+B6vblKH0Tk3GwKKHFxcSgqKsKtt96Ks2fPYunSpbj77rtRXV0Ng8EApVIJf39/q+doNBoYDAYAgMFgsAonlu2WbVeTl5eHpUuXthvfu3cvfHx8bGmh2/LH2m+tHTt2XHWb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2sLVenN0H1lZWdi2bRv279+PQYMGSePBwcFoaWlBQ0OD1VmUuro6BAcHS3MOHTpktZ7lLh/LHCJyDjYHlKNHj0Kr1eLSpUvo06cPNm/ejKioKFRVVfXI6Vfg6teI9+7d2+vXiO193fRqunI9tbeudXaHs1wn7QpX6c2Wa8T2JITA3LlzsXnzZnz88ceIiIiw2h4TEwOFQoHS0lKkpaUBAGpqalBbWwutVgsA0Gq1ePHFF1FfX4+goCAAv/xc1Go1oqKierchIuoWmwPKrbfeiqqqKjQ2NuL9999HRkYG9u3b1xO1Sa52jXj8+PEIDAzs0X1fyV7XTa+mO9dTe/paZ3c423VSW7hab7ZcI7YnnU6HjRs34oMPPkDfvn2lf7T4+fnB29sbfn5+mDVrFrKzsxEQEAC1Wo25c+dCq9UiPj4eAJCUlISoqCjMmDED+fn5MBgMWLRoEXQ6XYeXcYhIvmwOKEqlEkOGDAHwy79oKioq8Oc//xmPPPJIj51+ldM14t66xtmV66nO8MvRWa6TdoWr9OaoHtasWQMAuPfee63GCwsL8cQTTwAAVq5cCXd3d6SlpVndKWjh4eGBbdu2ITMzE1qtFr6+vsjIyMCyZct6qw0ispNu39trNpthNBp5+pWIukWI67/uysvLCwUFBSgoKLjqnPDwcKe43ElE12ZTQMnJyUFKSgrCwsJw/vx5bNy4ER9//DF27drF069ERERkNzYFlPr6esycORNnz56Fn58fRo0ahV27diExMREAT78SERGRfdgUUNatW3fN7Tz9SkRERPbADwskIiIi2eEH4BAR0XUNfm67o0ugGwzPoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkewwoBAREZHsMKAQERGR7DCgEBERkezYFFDy8vIwZswY9O3bF0FBQZgyZQpqamqs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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "prices = pd.DataFrame({\"price\":train_df[\"SalePrice\"], \"log(price + 1)\":np.log1p(train_df[\"SalePrice\"])})\n",
    "prices.hist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见，label本身并不平滑。为了我们分类器的学习更加准确，我们会首先把label给“平滑化”（正态化）\n",
    "\n",
    "这一步大部分同学会miss掉，导致自己的结果总是达不到一定标准。\n",
    "\n",
    "这里我们使用最有逼格的log1p, 也就是 log(x+1)，避免了复值的问题。\n",
    "\n",
    "记住哟，如果我们这里把数据都给平滑化了，那么最后算结果的时候，要记得把预测到的平滑数据给变回去。\n",
    "\n",
    "按照“怎么来的怎么去”原则，log1p()就需要expm1(); 同理，log()就需要exp(), ... etc."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = np.log1p(train_df.pop('SalePrice'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后我们把剩下的部分合并起来"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "all_df = pd.concat((train_df, test_df), axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此刻，我们可以看到all_df就是我们合在一起的DF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2919, 79)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而*y_train*则是*SalePrice*那一列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Id\n",
       "1    12.247699\n",
       "2    12.109016\n",
       "3    12.317171\n",
       "4    11.849405\n",
       "5    12.429220\n",
       "Name: SalePrice, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: 变量转化\n",
    "\n",
    "类似『特征工程』。就是把不方便处理或者不unify的数据给统一了。\n",
    "\n",
    "#### 正确化变量属性\n",
    "\n",
    "首先，我们注意到，*MSSubClass* 的值其实应该是一个category，\n",
    "\n",
    "但是Pandas是不会懂这些事儿的。使用DF的时候，这类数字符号会被默认记成数字。\n",
    "\n",
    "这种东西就很有误导性，我们需要把它变回成*string*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int64')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_df['MSSubClass'].dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "变成*str*以后，做个统计，就很清楚了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MSSubClass\n",
       "20     1079\n",
       "60      575\n",
       "50      287\n",
       "120     182\n",
       "30      139\n",
       "70      128\n",
       "160     128\n",
       "80      118\n",
       "90      109\n",
       "190      61\n",
       "85       48\n",
       "75       23\n",
       "45       18\n",
       "180      17\n",
       "40        6\n",
       "150       1\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_df['MSSubClass'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 把category的变量转变成numerical表达形式\n",
    "\n",
    "当我们用numerical来表达categorical的时候，要注意，数字本身有大小的含义，所以乱用数字会给之后的模型学习带来麻烦。于是我们可以用One-Hot的方法来表达category。\n",
    "\n",
    "pandas自带的get_dummies方法，可以帮你一键做到One-Hot。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MSSubClass_120</th>\n",
       "      <th>MSSubClass_150</th>\n",
       "      <th>MSSubClass_160</th>\n",
       "      <th>MSSubClass_180</th>\n",
       "      <th>MSSubClass_190</th>\n",
       "      <th>MSSubClass_20</th>\n",
       "      <th>MSSubClass_30</th>\n",
       "      <th>MSSubClass_40</th>\n",
       "      <th>MSSubClass_45</th>\n",
       "      <th>MSSubClass_50</th>\n",
       "      <th>MSSubClass_60</th>\n",
       "      <th>MSSubClass_70</th>\n",
       "      <th>MSSubClass_75</th>\n",
       "      <th>MSSubClass_80</th>\n",
       "      <th>MSSubClass_85</th>\n",
       "      <th>MSSubClass_90</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    MSSubClass_120  MSSubClass_150  MSSubClass_160  MSSubClass_180  \\\n",
       "Id                                                                   \n",
       "1            False           False           False           False   \n",
       "2            False           False           False           False   \n",
       "3            False           False           False           False   \n",
       "4            False           False           False           False   \n",
       "5            False           False           False           False   \n",
       "\n",
       "    MSSubClass_190  MSSubClass_20  MSSubClass_30  MSSubClass_40  \\\n",
       "Id                                                                \n",
       "1            False          False          False          False   \n",
       "2            False           True          False          False   \n",
       "3            False          False          False          False   \n",
       "4            False          False          False          False   \n",
       "5            False          False          False          False   \n",
       "\n",
       "    MSSubClass_45  MSSubClass_50  MSSubClass_60  MSSubClass_70  MSSubClass_75  \\\n",
       "Id                                                                              \n",
       "1           False          False           True          False          False   \n",
       "2           False          False          False          False          False   \n",
       "3           False          False           True          False          False   \n",
       "4           False          False          False           True          False   \n",
       "5           False          False           True          False          False   \n",
       "\n",
       "    MSSubClass_80  MSSubClass_85  MSSubClass_90  \n",
       "Id                                               \n",
       "1           False          False          False  \n",
       "2           False          False          False  \n",
       "3           False          False          False  \n",
       "4           False          False          False  \n",
       "5           False          False          False  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.get_dummies(all_df['MSSubClass'], prefix='MSSubClass').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此刻*MSSubClass*被我们分成了12个column，每一个代表一个category。是就是1，不是就是0。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同理，我们把所有的category数据，都给One-Hot了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>LotFrontage</th>\n",
       "      <th>LotArea</th>\n",
       "      <th>OverallQual</th>\n",
       "      <th>OverallCond</th>\n",
       "      <th>YearBuilt</th>\n",
       "      <th>YearRemodAdd</th>\n",
       "      <th>MasVnrArea</th>\n",
       "      <th>BsmtFinSF1</th>\n",
       "      <th>BsmtFinSF2</th>\n",
       "      <th>BsmtUnfSF</th>\n",
       "      <th>...</th>\n",
       "      <th>SaleType_ConLw</th>\n",
       "      <th>SaleType_New</th>\n",
       "      <th>SaleType_Oth</th>\n",
       "      <th>SaleType_WD</th>\n",
       "      <th>SaleCondition_Abnorml</th>\n",
       "      <th>SaleCondition_AdjLand</th>\n",
       "      <th>SaleCondition_Alloca</th>\n",
       "      <th>SaleCondition_Family</th>\n",
       "      <th>SaleCondition_Normal</th>\n",
       "      <th>SaleCondition_Partial</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>65.0</td>\n",
       "      <td>8450</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>2003</td>\n",
       "      <td>2003</td>\n",
       "      <td>196.0</td>\n",
       "      <td>706.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>150.0</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>80.0</td>\n",
       "      <td>9600</td>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "      <td>1976</td>\n",
       "      <td>1976</td>\n",
       "      <td>0.0</td>\n",
       "      <td>978.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>284.0</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>68.0</td>\n",
       "      <td>11250</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>2001</td>\n",
       "      <td>2002</td>\n",
       "      <td>162.0</td>\n",
       "      <td>486.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>434.0</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>60.0</td>\n",
       "      <td>9550</td>\n",
       "      <td>7</td>\n",
       "      <td>5</td>\n",
       "      <td>1915</td>\n",
       "      <td>1970</td>\n",
       "      <td>0.0</td>\n",
       "      <td>216.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>540.0</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>84.0</td>\n",
       "      <td>14260</td>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>2000</td>\n",
       "      <td>2000</td>\n",
       "      <td>350.0</td>\n",
       "      <td>655.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>490.0</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 302 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    LotFrontage  LotArea  OverallQual  OverallCond  YearBuilt  YearRemodAdd  \\\n",
       "Id                                                                            \n",
       "1          65.0     8450            7            5       2003          2003   \n",
       "2          80.0     9600            6            8       1976          1976   \n",
       "3          68.0    11250            7            5       2001          2002   \n",
       "4          60.0     9550            7            5       1915          1970   \n",
       "5          84.0    14260            8            5       2000          2000   \n",
       "\n",
       "    MasVnrArea  BsmtFinSF1  BsmtFinSF2  BsmtUnfSF  ...  SaleType_ConLw  \\\n",
       "Id                                                 ...                   \n",
       "1        196.0       706.0         0.0      150.0  ...           False   \n",
       "2          0.0       978.0         0.0      284.0  ...           False   \n",
       "3        162.0       486.0         0.0      434.0  ...           False   \n",
       "4          0.0       216.0         0.0      540.0  ...           False   \n",
       "5        350.0       655.0         0.0      490.0  ...           False   \n",
       "\n",
       "    SaleType_New  SaleType_Oth  SaleType_WD  SaleCondition_Abnorml  \\\n",
       "Id                                                                   \n",
       "1          False         False         True                  False   \n",
       "2          False         False         True                  False   \n",
       "3          False         False         True                  False   \n",
       "4          False         False         True                   True   \n",
       "5          False         False         True                  False   \n",
       "\n",
       "    SaleCondition_AdjLand  SaleCondition_Alloca  SaleCondition_Family  \\\n",
       "Id                                                                      \n",
       "1                   False                 False                 False   \n",
       "2                   False                 False                 False   \n",
       "3                   False                 False                 False   \n",
       "4                   False                 False                 False   \n",
       "5                   False                 False                 False   \n",
       "\n",
       "    SaleCondition_Normal  SaleCondition_Partial  \n",
       "Id                                               \n",
       "1                   True                  False  \n",
       "2                   True                  False  \n",
       "3                   True                  False  \n",
       "4                  False                  False  \n",
       "5                   True                  False  \n",
       "\n",
       "[5 rows x 302 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_dummy_df = pd.get_dummies(all_df)\n",
    "all_dummy_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 处理好numerical变量\n",
    "\n",
    "就算是numerical的变量，也还会有一些小问题。\n",
    "\n",
    "比如，有一些数据是缺失的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LotFrontage     486\n",
       "GarageYrBlt     159\n",
       "MasVnrArea       23\n",
       "BsmtFullBath      2\n",
       "BsmtHalfBath      2\n",
       "BsmtUnfSF         1\n",
       "GarageArea        1\n",
       "TotalBsmtSF       1\n",
       "GarageCars        1\n",
       "BsmtFinSF2        1\n",
       "dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，缺失最多的column是LotFrontage"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "处理这些缺失的信息，得靠好好审题。一般来说，数据集的描述里会写的很清楚，这些缺失都代表着什么。当然，如果实在没有的话，也只能靠自己的『想当然』。。\n",
    "\n",
    "在这里，我们用平均值来填满这些空缺。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LotFrontage        69.305795\n",
       "LotArea         10168.114080\n",
       "OverallQual         6.089072\n",
       "OverallCond         5.564577\n",
       "YearBuilt        1971.312778\n",
       "YearRemodAdd     1984.264474\n",
       "MasVnrArea        102.201312\n",
       "BsmtFinSF1        441.423235\n",
       "BsmtFinSF2         49.582248\n",
       "BsmtUnfSF         560.772104\n",
       "dtype: float64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_cols = all_dummy_df.mean()\n",
    "mean_cols.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "all_dummy_df = all_dummy_df.fillna(mean_cols)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看看是不是没有空缺了？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_dummy_df.isnull().sum().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 标准化numerical数据\n",
    "\n",
    "这一步并不是必要，但是得看你想要用的分类器是什么。一般来说，regression的分类器都比较傲娇，最好是把源数据给放在一个标准分布内。不要让数据间的差距太大。\n",
    "\n",
    "这里，我们当然不需要把One-Hot的那些0/1数据给标准化。我们的目标应该是那些本来就是numerical的数据：\n",
    "\n",
    "先来看看 哪些是numerical的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['LotFrontage', 'LotArea', 'OverallQual', 'OverallCond', 'YearBuilt',\n",
       "       'YearRemodAdd', 'MasVnrArea', 'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF',\n",
       "       'TotalBsmtSF', '1stFlrSF', '2ndFlrSF', 'LowQualFinSF', 'GrLivArea',\n",
       "       'BsmtFullBath', 'BsmtHalfBath', 'FullBath', 'HalfBath', 'BedroomAbvGr',\n",
       "       'KitchenAbvGr', 'TotRmsAbvGrd', 'Fireplaces', 'GarageYrBlt',\n",
       "       'GarageCars', 'GarageArea', 'WoodDeckSF', 'OpenPorchSF',\n",
       "       'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'MiscVal',\n",
       "       'MoSold', 'YrSold'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numeric_cols = all_df.columns[all_df.dtypes != 'object']\n",
    "numeric_cols"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算标准分布：(X-X')/s\n",
    "\n",
    "让我们的数据点更平滑，更便于计算。\n",
    "\n",
    "注意：我们这里也是可以继续使用Log的，我只是给大家展示一下多种“使数据平滑”的办法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "numeric_col_means = all_dummy_df.loc[:, numeric_cols].mean()\n",
    "numeric_col_std = all_dummy_df.loc[:, numeric_cols].std()\n",
    "all_dummy_df.loc[:, numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means) / numeric_col_std"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: 建立模型\n",
    "\n",
    "#### 把数据集分回 训练/测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dummy_train_df = all_dummy_df.loc[train_df.index]\n",
    "dummy_test_df = all_dummy_df.loc[test_df.index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1460, 302), (1459, 302))"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dummy_train_df.shape, dummy_test_df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Ridge Regression\n",
    "\n",
    "用Ridge Regression模型来跑一遍看看。（对于多因子的数据集，这种模型可以方便的把所有的var都无脑的放进去）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Ridge\n",
    "from sklearn.model_selection import cross_val_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "这一步不是很必要，只是把DF转化成Numpy Array，这跟Sklearn更加配"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = dummy_train_df.values\n",
    "X_test = dummy_test_df.values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "用Sklearn自带的cross validation方法来测试模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "alphas = np.logspace(-3, 2, 50)\n",
    "test_scores = []\n",
    "for alpha in alphas:\n",
    "    clf = Ridge(alpha)\n",
    "    test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))\n",
    "    test_scores.append(np.mean(test_score))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "存下所有的CV值，看看哪个alpha值更好（也就是『调参数』）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAGzCAYAAADEw6Y0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQJUlEQVR4nO3de1hU9aI//vdcmBluAwjKiKCkWIZXFCGyspQko9sOTY2S7fHYLikv/OqUexdqfRVLjrEztno6ae2TbszSvdNTFtHWTltMgkiDtCwNFAZEhUFuAzPr9wfMgonrIKzF5f16nvUws9aHtT5r+Tzx7nNbCkEQBBARERENcEq5K0BEREQkBYYeIiIiGhQYeoiIiGhQYOghIiKiQYGhh4iIiAYFhh4iIiIaFBh6iIiIaFBg6CEiIqJBgaGHiIiIBgWGHqJBTqFQYN26dd3+3aeffrpnK0RE1EsYeogGsL/85S9QKBQIDw+Xuyp9nslkwvr16zF58mS4ubnB2dkZEyZMwPPPP4+ioiLU19fDx8cHt912W7vnEAQBAQEBmDp1aofXUigU7W5PPvlkT98aETVRy10BIuo9u3fvRmBgIE6cOIGzZ88iKChI7ir1Sb/88gsiIyNRUFCA+fPn44knnoBGo8HJkyfx9ttv48CBA/jxxx8xf/587NixA7/++itGjRrV6jxffvklLly4gNWrV3d6zbvvvhuLFy9utf/GG2/skXsiotYYeogGqHPnzuHYsWPYv38//vCHP2D37t1Yu3at3NXqcxoaGvDwww+jpKQER44cadWSs2HDBrz66qsAgNjYWGzfvh1/+9vf8MILL7Q61549e6BUKrFw4cJOr3vjjTfisccec7i+1dXVcHFxafM+rFYrNBqNw+e0qaqqgqura7d/n6ivY/cW0QC1e/dueHl5ITo6GvPmzcPu3bu79Hvr1q2DQqHA6dOn8cgjj0Cv18Pb2xsrV65EbW1tm7/z97//HRMmTIBWq8X48eNx+PBhu+O//vorli9fjptuugnOzs7w9vbG/Pnzcf78+Q7rUl9fjyFDhmDJkiWtjplMJuh0Ojz77LPivq1bt2L8+PFwcXGBl5cXQkNDsWfPng6v8eGHH+K7777Dn/70pza7rvR6PTZs2AAAmDFjBgIDA9s8Z319PT744APcdddd8PPz6/CaXXXnnXdiwoQJyM7Oxh133AEXFxf88Y9/xPnz56FQKJCcnIyUlBSMGTMGWq0W+fn5AIAvvvgCt99+O1xdXeHp6YkHH3wQP/zwg925bf/O+fn5ePTRR+Hl5dVh1x3RQMCWHqIBavfu3Xj44Yeh0WiwaNEibNu2DVlZWZg+fXqXfv+RRx5BYGAgkpKScPz4cbzxxhu4evUq/vrXv9qV++qrr7B//34sX74c7u7ueOONNxATE4OCggJ4e3sDALKysnDs2DEsXLgQ/v7+OH/+PLZt24Y777wT+fn5bbZcAICTkxN+97vfYf/+/dixY4ddK8bf//531NXVia0qb731FlasWIF58+aJAe3kyZP4+uuv8eijj7Z7nx999BEA4PHHH+/0mSgUCjz66KPYuHEj8vLyMH78ePHY4cOHceXKFcTGxnZ6HgCora1FWVlZq/16vd7uPi9fvoy5c+di4cKFeOyxx+Dr6yse27VrF2pra/HEE09Aq9ViyJAh+PzzzzF37lyMHj0a69atQ01NDbZu3YoZM2YgJycHgYGBdtebP38+xo4di40bN0IQhC7VnajfEohowPnmm28EAEJ6erogCIJgtVoFf39/YeXKla3KAhDWrl0rfl+7dq0AQHjggQfsyi1fvlwAIHz33Xd2v6vRaISzZ8+K+7777jsBgLB161ZxX3V1davrZmZmCgCEv/71rx3ey6effioAEA4ePGi3/9577xVGjx4tfn/wwQeF8ePHd3iutoSEhAgeHh5dLp+XlycAENasWWO3f+HChYJOpxMqKio6PQeAdre//e1vYrmZM2cKAITt27fb/f65c+cEAIJerxdKS0vtjk2ZMkUYNmyYcPnyZXHfd999JyiVSmHx4sXiPtu/86JFi7p870T9Hbu3iAag3bt3w9fXF3fddReAxhaKBQsWIC0tDRaLpUvniI+Pt/v+zDPPAAA+/vhju/2RkZEYM2aM+H3SpEnQ6/X45ZdfxH3Ozs7i5/r6ely+fBlBQUHw9PRETk5Oh/WYNWsWfHx8sHfvXnHf1atXkZ6ejgULFoj7PD09ceHCBWRlZXXp/mxMJhPc3d27XD44OBghISFIS0sT91VVVeGjjz7CfffdB71e36XzPPjgg0hPT2+12f7NbLRabZvdewAQExODoUOHit+Li4uRm5uL3//+9xgyZIi4f9KkSbj77rtb/dsB4GwxGlQYeogGGIvFgrS0NNx11104d+4czp49i7NnzyI8PBwlJSXIyMjo0nnGjh1r933MmDFQKpWtxuGMHDmy1e96eXnh6tWr4veamhokJiYiICAAWq0WPj4+GDp0KMrLy1FRUdFhPdRqNWJiYvCPf/wDdXV1AID9+/ejvr7eLvQ8//zzcHNzQ1hYGMaOHYv4+Hj861//6vQ+9Xo9KisrOy3XUmxsrDhQHGjsaquuru5y1xYA+Pv7IzIystXWsvsKAEaMGNHu4OQbbrjB7vuvv/4KALjppptalb355ptRVlaGqqqqDs9BNJAx9BANMF988QWKi4uRlpaGsWPHitsjjzwCAF0e0PxbCoWizf0qlarN/UKL8SHPPPMMNmzYgEceeQTvv/8+PvvsM6Snp8Pb2xtWq7XTay9cuBCVlZX45JNPAADvv/8+xo0bh8mTJ4tlbr75Zpw5cwZpaWm47bbb8OGHH+K2227rdMbauHHjUFFRgcLCwk7rYbNo0SIolUpxQPOePXvg5eWFe++9t8vn6KqWrWSOHOuJ8xMNNAw9RAPM7t27MWzYMOzbt6/VtmjRIhw4cAA1NTWdnuenn36y+3727FlYrdZWA2G74oMPPkBcXBz+8z//E/PmzcPdd9+N2267DeXl5V36/TvuuAPDhw/H3r17UVZWhi+++MKulcfG1dUVCxYswK5du1BQUIDo6Ghs2LCh3VlnAHD//fcDAN57770u34+fnx/uuusu7Nu3DyUlJUhPT8e8efOua7p4T7CtHXTmzJlWx06fPg0fHx9OSadBjaGHaACpqanB/v37cd9992HevHmttqeffhqVlZXijKWOpKam2n3funUrAGDu3LkO10ulUrWaGbR169Yujy9SKpWYN28eDh48iP/5n/9BQ0NDq9Bz+fJlu+8ajQbBwcEQBAH19fXtnnvevHmYOHEiNmzYgMzMzFbHKysr8ac//anV/tjYWJSWluIPf/gD6uvrHera6i3Dhw/HlClT8O6779oFyu+//x6fffZZr7REEfUnnLJONIB89NFHqKysxAMPPNDm8VtuuQVDhw7F7t2722wpaencuXN44IEHcM899yAzMxPvvfceHn30Ubsupa6677778D//8z/w8PBAcHAwMjMz8fnnn4tT2rtiwYIF2Lp1K9auXYuJEyfi5ptvtjs+Z84cGAwGzJgxA76+vvjhhx/w5ptvIjo6usOByk5OTti/fz8iIyNxxx134JFHHsGMGTPg5OSEvLw8sevKtlaPTUxMDJYvX45//OMfCAgIwB133OHQM/nxxx/bbF3y9fXF3Xff7dC5Wtq8eTPmzp2LiIgILF26VJyy7uHh0e13rBENFAw9RAPI7t27odPp2v2jqVQqER0djd27d+Py5csdho69e/ciMTERL7zwAtRqNZ5++mls3ry5W/X685//DJVKhd27d6O2thYzZszA559/jqioqC6f49Zbb0VAQAAKCwvbDGy2Vae3bNmCa9euwd/fHytWrMCLL77Y6bmDgoKQm5uL119/HQcOHMDf//53WK1WBAUF4d///d+xYsWKVr+j1+tx//33i92G7Y15ao9tttZvzZw587pCT2RkJA4fPoy1a9ciMTERTk5OmDlzJl599VUOWqZBTyH8ts2ZiAa1devWYf369bh06RJ8fHzkrg4RUY/hmB4iIiIaFBh6iIiIaFBg6CEiIqJBgWN6iIiIaFBgSw8RERENCgw9RERENChwnZ4WrFYrioqK4O7u7vCaG0RERCQPQRBQWVkJPz8/KJXtt+cw9LRQVFSEgIAAuatBRERE3VBYWAh/f/92jzP0tGBbqr6wsBB6vV7m2hAREVFXmEwmBAQEdPjKGYChx46tS0uv1zP0EBER9TOdDU3hQGYiIiIaFBh6iIiIaFBg6CEiIqJBgaGHiIiIBgWGHiIiIhoUGHqIiIhoUGDoISIiokGBoYeIiIgGBYYeIiIiGhQYeoiIiGhQYOghIiKiQYGhh4iIiAYFvnBUAp/nl+Crs2W4ZbQ37plgkLs6REREgxJbeiSQXXAV7xw7jxPnrshdFSIiokGLoUcCthfdCxBkrQcREdFgxtAjAYWi8zJERETUuxh6JCSwoYeIiEg2DD0SUIBNPURERHJj6CEiIqJBgaFHQgL7t4iIiGTD0CMBDmQmIiKSH0OPBJqnrBMREZFcGHqk0NTUw94tIiIi+TD0SIiLExIREcmnW6EnNTUVgYGB0Ol0CA8Px4kTJ9otm5eXh5iYGAQGBkKhUCAlJaVVmXXr1kGhUNht48aNE49fuXIFzzzzDG666SY4Oztj5MiRWLFiBSoqKuzO89tzKBQKpKWldecWe5TYvcXMQ0REJBuHXzi6d+9eJCQkYPv27QgPD0dKSgqioqJw5swZDBs2rFX56upqjB49GvPnz8fq1avbPe/48ePx+eefN1dM3Vy1oqIiFBUVITk5GcHBwfj111/x5JNPoqioCB988IHdeXbt2oV77rlH/O7p6enoLfY420BmZh4iIiL5OBx6tmzZgmXLlmHJkiUAgO3bt+N///d/sXPnTrzwwgutyk+fPh3Tp08HgDaPixVRq2EwtP0G8gkTJuDDDz8Uv48ZMwYbNmzAY489hoaGBruA5Onp2e555MLFCYmIiOTnUPeW2WxGdnY2IiMjm0+gVCIyMhKZmZnXVZGffvoJfn5+GD16NGJjY1FQUNBh+YqKCuj1ervAAwDx8fHw8fFBWFgYdu7c2eHaOHV1dTCZTHZbbxBbetjUQ0REJBuHQk9ZWRksFgt8fX3t9vv6+sJoNHa7EuHh4XjnnXdw+PBhbNu2DefOncPtt9+OysrKduvxyiuv4IknnrDb//LLL+P9999Heno6YmJisHz5cmzdurXd6yYlJcHDw0PcAgICun0PHWE7DxERkfwc7t7qDXPnzhU/T5o0CeHh4Rg1ahTef/99LF261K6syWRCdHQ0goODsW7dOrtjL730kvg5JCQEVVVV2Lx5M1asWNHmddesWYOEhAS7c/dW8GnEph4iIiK5ONTS4+PjA5VKhZKSErv9JSUlPTqOxtPTEzfeeCPOnj1rt7+yshL33HMP3N3dceDAATg5OXV4nvDwcFy4cAF1dXVtHtdqtdDr9XZbb2D3FhERkfwcCj0ajQbTpk1DRkaGuM9qtSIjIwMRERE9Vqlr167h559/xvDhw8V9JpMJc+bMgUajwUcffQSdTtfpeXJzc+Hl5QWtVttjdesOBRcnJCIikp3D3VsJCQmIi4tDaGgowsLCkJKSgqqqKnE21+LFizFixAgkJSUBaBz8nJ+fL36+ePEicnNz4ebmhqCgIADAs88+i/vvvx+jRo1CUVER1q5dC5VKhUWLFgFoDjzV1dV477337AYdDx06FCqVCgcPHkRJSQluueUW6HQ6pKenY+PGjXj22Wev/yn1EC5OSEREJB+HQ8+CBQtw6dIlJCYmwmg0YsqUKTh8+LA4uLmgoABKZXMDUlFREUJCQsTvycnJSE5OxsyZM3HkyBEAwIULF7Bo0SJcvnwZQ4cOxW233Ybjx49j6NChAICcnBx8/fXXACAGJZtz584hMDAQTk5OSE1NxerVqyEIAoKCgsTp9XJj9xYREZH8FEJHc7oHGZPJBA8PD3E6fE/ZduRnvHr4NOZN80fy/Mk9dl4iIiLq+t9vvntLAmzpISIikh9DjwS4Tg8REZH8GHokxJ5EIiIi+TD0SIAvHCUiIpIfQ48EbC8cZUsPERGRfBh6JMCWHiIiIvkx9EiIDT1ERETyYeiRgNL2GgqZ60FERDSYMfRIoHmdHsYeIiIiuTD0SMC2Tg8jDxERkXwYeiSg4EhmIiIi2TH0SKA58zD1EBERyYWhRwK2lh6rVeaKEBERDWIMPRJoHtPDlh4iIiK5MPRIgG9ZJyIikh9DjwTE11DIXA8iIqLBjKFHAmzpISIikh9DjwQU4iemHiIiIrkw9EhAfA0FMw8REZFsGHqk0NTUY2XqISIikg1DjwT4GgoiIiL5MfRIQMHuLSIiItkx9EhAye4tIiIi2TH0SECh6LwMERER9S6GHgnYFidkSw8REZF8GHokwMUJiYiI5MfQIwEOZCYiIpIfQ48EbEN62L1FREQkH4YeCYgrMstcDyIiosGMoUcCzWN6GHuIiIjkwtAjASUHMhMREcmOoUcSnLJOREQkN4YeCYgtPfJWg4iIaFBj6JGAbcq6lamHiIhINgw9ElCKr1ln6iEiIpILQ48EFOILR+WtBxER0WDWrdCTmpqKwMBA6HQ6hIeH48SJE+2WzcvLQ0xMDAIDA6FQKJCSktKqzLp166BQKOy2cePG2ZWpra1FfHw8vL294ebmhpiYGJSUlNiVKSgoQHR0NFxcXDBs2DA899xzaGho6M4t9qjm7i2mHiIiIrk4HHr27t2LhIQErF27Fjk5OZg8eTKioqJQWlraZvnq6mqMHj0amzZtgsFgaPe848ePR3Fxsbh99dVXdsdXr16NgwcPYt++fTh69CiKiorw8MMPi8ctFguio6NhNptx7NgxvPvuu3jnnXeQmJjo6C32OCVfQ0FERCQ7h0PPli1bsGzZMixZsgTBwcHYvn07XFxcsHPnzjbLT58+HZs3b8bChQuh1WrbPa9arYbBYBA3Hx8f8VhFRQXefvttbNmyBbNmzcK0adOwa9cuHDt2DMePHwcAfPbZZ8jPz8d7772HKVOmYO7cuXjllVeQmpoKs9ns6G32KL6GgoiISH4OhR6z2Yzs7GxERkY2n0CpRGRkJDIzM6+rIj/99BP8/PwwevRoxMbGoqCgQDyWnZ2N+vp6u+uOGzcOI0eOFK+bmZmJiRMnwtfXVywTFRUFk8mEvLy8Nq9ZV1cHk8lkt/UGW0sPERERyceh0FNWVgaLxWIXLADA19cXRqOx25UIDw/HO++8g8OHD2Pbtm04d+4cbr/9dlRWVgIAjEYjNBoNPD09272u0Whss162Y21JSkqCh4eHuAUEBHT7HjqiFAcys6WHiIhILn1i9tbcuXMxf/58TJo0CVFRUfj4449RXl6O999/v1evu2bNGlRUVIhbYWFhr1xHwTE9REREslM7UtjHxwcqlarVrKmSkpIOByk7ytPTEzfeeCPOnj0LADAYDDCbzSgvL7dr7Wl5XYPB0GoWma2e7dVNq9V2OM6opyjY0kNERCQ7h1p6NBoNpk2bhoyMDHGf1WpFRkYGIiIieqxS165dw88//4zhw4cDAKZNmwYnJye76545cwYFBQXidSMiInDq1Cm7WWTp6enQ6/UIDg7usbp1B2dvERERyc+hlh4ASEhIQFxcHEJDQxEWFoaUlBRUVVVhyZIlAIDFixdjxIgRSEpKAtA4+Dk/P1/8fPHiReTm5sLNzQ1BQUEAgGeffRb3338/Ro0ahaKiIqxduxYqlQqLFi0CAHh4eGDp0qVISEjAkCFDoNfr8cwzzyAiIgK33HILAGDOnDkIDg7G448/jtdeew1GoxEvvvgi4uPjJWnN6QjfvUVERCQ/h0PPggULcOnSJSQmJsJoNGLKlCk4fPiwOGi4oKAASmVzA1JRURFCQkLE78nJyUhOTsbMmTNx5MgRAMCFCxewaNEiXL58GUOHDsVtt92G48ePY+jQoeLvvf7661AqlYiJiUFdXR2ioqLwl7/8RTyuUqlw6NAhPPXUU4iIiICrqyvi4uLw8ssvO/xQepptTI+FSzITERHJRiEI7HSxMZlM8PDwQEVFBfR6fY+d99uCq/jdX44hYIgz/u8/ZvXYeYmIiKjrf7/7xOytgU58DYVV5ooQERENYgw9ElBybUIiIiLZMfRIQMkXjhIREcmOoUcCXKeHiIhIfgw9Emhu6ZG5IkRERIMYQ48EmhcnZOohIiKSC0OPBJpfOCpvPYiIiAYzhh4JKDiQmYiISHYMPRIQW3rY1ENERCQbhh4JcCAzERGR/Bh6JMCBzERERPJj6JGAbZ0eC0MPERGRbBh6JKBSsnuLiIhIbgw9EmD3FhERkfwYeiTAdXqIiIjkx9AjAds6PRamHiIiItkw9EjANqYHYBcXERGRXBh6JNAi87CLi4iISCYMPRKwdW8B7OIiIiKSC0OPBFp2b/H9W0RERPJg6JFAy+4tZh4iIiJ5MPRIQNmye4uph4iISBYMPRJoGXrYvUVERCQPhh4J2M3e4kBmIiIiWTD0SMB+ILOMFSEiIhrEGHokwCnrRERE8mPokUjzm9YZeoiIiOTA0CMRlYKhh4iISE4MPRKx9XCxe4uIiEgeDD0SsXVvsaGHiIhIHgw9ErGt1cOWHiIiInkw9EjENmudKzITERHJg6FHIs3dWww9REREcmDokUhz95bMFSEiIhqkGHokolRyTA8REZGcuhV6UlNTERgYCJ1Oh/DwcJw4caLdsnl5eYiJiUFgYCAUCgVSUlI6PPemTZugUCiwatUqcd/58+ehUCja3Pbt2yeWa+t4Wlpad26xx3GdHiIiInk5HHr27t2LhIQErF27Fjk5OZg8eTKioqJQWlraZvnq6mqMHj0amzZtgsFg6PDcWVlZ2LFjByZNmmS3PyAgAMXFxXbb+vXr4ebmhrlz59qV3bVrl125hx56yNFb7BUqtvQQERHJyuHQs2XLFixbtgxLlixBcHAwtm/fDhcXF+zcubPN8tOnT8fmzZuxcOFCaLXads977do1xMbG4q233oKXl5fdMZVKBYPBYLcdOHAAjzzyCNzc3OzKenp62pXT6XSO3mKvUDY9ac7eIiIikodDocdsNiM7OxuRkZHNJ1AqERkZiczMzOuqSHx8PKKjo+3O3Z7s7Gzk5uZi6dKlbZ7Hx8cHYWFh2LlzZ4ezperq6mAymey23iJ2b7Glh4iISBZqRwqXlZXBYrHA19fXbr+vry9Onz7d7UqkpaUhJycHWVlZXSr/9ttv4+abb8att95qt//ll1/GrFmz4OLigs8++wzLly/HtWvXsGLFijbPk5SUhPXr13e73o6wdW81MPQQERHJwqHQ0xsKCwuxcuVKpKend6krqqamBnv27MFLL73U6ljLfSEhIaiqqsLmzZvbDT1r1qxBQkKC+N1kMiEgIKAbd9E58S3rDD1ERESycKh7y8fHByqVCiUlJXb7S0pKOh2k3J7s7GyUlpZi6tSpUKvVUKvVOHr0KN544w2o1WpYLBa78h988AGqq6uxePHiTs8dHh6OCxcuoK6urs3jWq0Wer3ebust4jo9HNNDREQkC4dCj0ajwbRp05CRkSHus1qtyMjIQERERLcqMHv2bJw6dQq5ubniFhoaitjYWOTm5kKlUtmVf/vtt/HAAw9g6NChnZ47NzcXXl5eHQ6glgpnbxEREcnL4e6thIQExMXFITQ0FGFhYUhJSUFVVRWWLFkCAFi8eDFGjBiBpKQkAI2Dn/Pz88XPFy9eRG5uLtzc3BAUFAR3d3dMmDDB7hqurq7w9vZutf/s2bP48ssv8fHHH7eq18GDB1FSUoJbbrkFOp0O6enp2LhxI5599llHb7FXiN1bbOkhIiKShcOhZ8GCBbh06RISExNhNBoxZcoUHD58WBzcXFBQAKWyuQGpqKgIISEh4vfk5GQkJydj5syZOHLkiEPX3rlzJ/z9/TFnzpxWx5ycnJCamorVq1dDEAQEBQWJ0+v7AnEgs4Whh4iISA4KgW/AFJlMJnh4eKCioqLHx/fM23YM3/x6Fdsfm4p7Jgzv0XMTERENZl39+813b0mk+d1bMleEiIhokGLokYiKs7eIiIhkxdAjEbWK6/QQERHJiaFHIlyRmYiISF4MPRIRu7esHNRDREQkB4YeibClh4iISF4MPRKxjenhisxERETyYOiRiKppwUaGHiIiInkw9EikqaGHoYeIiEgmDD0SsbX0cEwPERGRPBh6JKLmW9aJiIhkxdAjEZWKLxwlIiKSE0OPRPgaCiIiInkx9EhEpeTihERERHJi6JGImosTEhERyYqhRyIc00NERCQvhh6JcPYWERGRvBh6JNK8Tg/H9BAREcmBoUciTkp2bxEREcmJoUci4pgedm8RERHJgqFHIk627i0Lu7eIiIjkwNAjETVbeoiIiGTF0CMRNcf0EBERyYqhRyJqFWdvERERyYmhRyIqrshMREQkK4YeiThxRWYiIiJZMfRIRM3FCYmIiGTF0CMRDmQmIiKSF0OPRGwDmes5poeIiEgWDD0SaX7hKLu3iIiI5MDQIxE1BzITERHJiqFHIraBzPV8DQUREZEsGHokolE3tvTUs6WHiIhIFgw9EnFS8YWjREREcmLokYite8vMlh4iIiJZMPRIxNa9xcUJiYiI5NGt0JOamorAwEDodDqEh4fjxIkT7ZbNy8tDTEwMAgMDoVAokJKS0uG5N23aBIVCgVWrVtntv/POO6FQKOy2J5980q5MQUEBoqOj4eLigmHDhuG5555DQ0NDd26xx9m6t+obGHqIiIjk4HDo2bt3LxISErB27Vrk5ORg8uTJiIqKQmlpaZvlq6urMXr0aGzatAkGg6HDc2dlZWHHjh2YNGlSm8eXLVuG4uJicXvttdfEYxaLBdHR0TCbzTh27BjeffddvPPOO0hMTHT0FnsFFyckIiKSl8OhZ8uWLVi2bBmWLFmC4OBgbN++HS4uLti5c2eb5adPn47Nmzdj4cKF0Gq17Z732rVriI2NxVtvvQUvL682y7i4uMBgMIibXq8Xj3322WfIz8/He++9hylTpmDu3Ll45ZVXkJqaCrPZ7Oht9jjbC0frLVYIAoMPERGR1BwKPWazGdnZ2YiMjGw+gVKJyMhIZGZmXldF4uPjER0dbXfu39q9ezd8fHwwYcIErFmzBtXV1eKxzMxMTJw4Eb6+vuK+qKgomEwm5OXltXm+uro6mEwmu623ODUNZBYEwMLWHiIiIsmpHSlcVlYGi8ViFywAwNfXF6dPn+52JdLS0pCTk4OsrKx2yzz66KMYNWoU/Pz8cPLkSTz//PM4c+YM9u/fDwAwGo1t1st2rC1JSUlYv359t+vtCCd1c75ssApQqyS5LBERETVxKPT0hsLCQqxcuRLp6enQ6XTtlnviiSfEzxMnTsTw4cMxe/Zs/PzzzxgzZky3rr1mzRokJCSI300mEwICArp1rs7YurcAwGyxQufE1ENERCQlh7q3fHx8oFKpUFJSYre/pKSk00HK7cnOzkZpaSmmTp0KtVoNtVqNo0eP4o033oBarYbFYmnz98LDwwEAZ8+eBQAYDIY262U71hatVgu9Xm+39RZb9xbA928RERHJwaHQo9FoMG3aNGRkZIj7rFYrMjIyEBER0a0KzJ49G6dOnUJubq64hYaGIjY2Frm5uVCp2m4Ryc3NBQAMHz4cABAREYFTp07ZzSJLT0+HXq9HcHBwt+rWk5RKBVTK5sHMREREJC2Hu7cSEhIQFxeH0NBQhIWFISUlBVVVVViyZAkAYPHixRgxYgSSkpIANA5+zs/PFz9fvHgRubm5cHNzQ1BQENzd3TFhwgS7a7i6usLb21vc//PPP2PPnj2499574e3tjZMnT2L16tW44447xOntc+bMQXBwMB5//HG89tprMBqNePHFFxEfH9/hrDEpOakUsFgFhh4iIiIZOBx6FixYgEuXLiExMRFGoxFTpkzB4cOHxUHDBQUFULboyikqKkJISIj4PTk5GcnJyZg5cyaOHDnSpWtqNBp8/vnnYsAKCAhATEwMXnzxRbGMSqXCoUOH8NRTTyEiIgKurq6Ii4vDyy+/7Ogt9honpRK1sPKlo0RERDJQCFw0RmQymeDh4YGKiopeGd8z9ZV0XKky47PVd+BGX/cePz8REdFg1NW/33z3loQ0Tasym/kqCiIiIskx9EhI07RWTx1DDxERkeQYeiRkCz1s6SEiIpIeQ4+ExO4tzt4iIiKSHEOPhNjSQ0REJB+GHgkx9BAREcmHoUdCWlvoaefVGkRERNR7GHokxCnrRERE8mHokRC7t4iIiOTD0CMhrtNDREQkH4YeCXHKOhERkXwYeiTE7i0iIiL5MPRIyIkDmYmIiGTD0CMhLVt6iIiIZMPQI6HmdXoYeoiIiKTG0CMhrZMKAFBXz9BDREQkNYYeCdlaemobuCIzERGR1Bh6JMSWHiIiIvkw9EhIx5YeIiIi2TD0SMjW0lNbz9BDREQkNYYeCen4GgoiIiLZMPRISCe29DD0EBERSY2hR0K22Vt17N4iIiKSHEOPhGwtPezeIiIikh5Dj4R0HMhMREQkG4YeCYmLEzL0EBERSY6hR0Ls3iIiIpIPQ4+EdE6Nj7vBKqCBLx0lIiKSFEOPhLRqlfi5lq09REREkmLokZBtTA/AaetERERSY+iRkFKpgKYp+NQw9BAREUmKoUdizpy2TkREJAuGHom5aBpDT7WZoYeIiEhKDD0Sc24KPTUMPURERJJi6JGY2NLD7i0iIiJJdSv0pKamIjAwEDqdDuHh4Thx4kS7ZfPy8hATE4PAwEAoFAqkpKR0eO5NmzZBoVBg1apV4r4rV67gmWeewU033QRnZ2eMHDkSK1asQEVFhd3vKhSKVltaWlp3brHXuDipAbClh4iISGoOh569e/ciISEBa9euRU5ODiZPnoyoqCiUlpa2Wb66uhqjR4/Gpk2bYDAYOjx3VlYWduzYgUmTJtntLyoqQlFREZKTk/H999/jnXfeweHDh7F06dJW59i1axeKi4vF7aGHHnL0FnuVM8f0EBERycLh0LNlyxYsW7YMS5YsQXBwMLZv3w4XFxfs3LmzzfLTp0/H5s2bsXDhQmi12nbPe+3aNcTGxuKtt96Cl5eX3bEJEybgww8/xP33348xY8Zg1qxZ2LBhAw4ePIiGhga7sp6enjAYDOKm0+kcvcVeZZu9VWNu6KQkERER9SSHQo/ZbEZ2djYiIyObT6BUIjIyEpmZmddVkfj4eERHR9uduyMVFRXQ6/VQq9WtzuPj44OwsDDs3LkTgiC0e466ujqYTCa7rbdx9hYREZE81J0XaVZWVgaLxQJfX1+7/b6+vjh9+nS3K5GWloacnBxkZWV1uR6vvPIKnnjiCbv9L7/8MmbNmgUXFxd89tlnWL58Oa5du4YVK1a0eZ6kpCSsX7++2/XuDnH2FgcyExERScqh0NMbCgsLsXLlSqSnp3epK8pkMiE6OhrBwcFYt26d3bGXXnpJ/BwSEoKqqips3ry53dCzZs0aJCQk2J07ICCgezfSRS6csk5ERCQLh7q3fHx8oFKpUFJSYre/pKSk00HK7cnOzkZpaSmmTp0KtVoNtVqNo0eP4o033oBarYbF0hwOKisrcc8998Dd3R0HDhyAk5NTh+cODw/HhQsXUFdX1+ZxrVYLvV5vt/U2Z01jzmT3FhERkbQcCj0ajQbTpk1DRkaGuM9qtSIjIwMRERHdqsDs2bNx6tQp5ObmiltoaChiY2ORm5sLlaqxZcRkMmHOnDnQaDT46KOPutQqlJubCy8vrw4HUEuNY3qIiIjk4XD3VkJCAuLi4hAaGoqwsDCkpKSgqqoKS5YsAQAsXrwYI0aMQFJSEoDGwc/5+fni54sXLyI3Nxdubm4ICgqCu7s7JkyYYHcNV1dXeHt7i/ttgae6uhrvvfee3aDjoUOHQqVS4eDBgygpKcEtt9wCnU6H9PR0bNy4Ec8++2z3n04vELu36jl7i4iISEoOh54FCxbg0qVLSExMhNFoxJQpU3D48GFxcHNBQQGUyuYGpKKiIoSEhIjfk5OTkZycjJkzZ+LIkSNdumZOTg6+/vprAEBQUJDdsXPnziEwMBBOTk5ITU3F6tWrIQgCgoKCxOn1fYnOiS09REREclAIHc3pHmRMJhM8PDzE6fC94dDJIjy951uE3zAEe//QvS5BIiIiatbVv99895bEOKaHiIhIHgw9EnPTNs44q+KKzERERJJi6JGYm7ZxGNW1WoYeIiIiKTH0SMxd1xR66hh6iIiIpMTQIzFbS0+12QKLlWPIiYiIpMLQIzFXbfMqAWztISIikg5Dj8Q0aiU06sbHztBDREQkHYYeGbhzMDMREZHkGHpk4CYOZq6XuSZERESDB0OPDGyDmSvZ0kNERCQZhh4ZiGv1cEwPERGRZBh6ZGBbq6eKoYeIiEgyDD0ycGX3FhERkeQYemTA7i0iIiLpMfTIQJy9xZYeIiIiyTD0yMCdLT1ERESSY+iRAaesExERSY+hRwaeLhoAQEUNFyckIiKSCkOPDDxcnAAA5TVmmWtCREQ0eDD0yMDTuSn0VLOlh4iISCoMPTIQu7cYeoiIiCTD0CMDW0tPZV0D6i1WmWtDREQ0ODD0yEDfFHoAwMTBzERERJJg6JGBSqmAvmmBwnKGHiIiIkkw9MjENq6Hg5mJiIikwdAjE8+maesVnLZOREQkCYYemXhw2joREZGkGHpkwu4tIiIiaTH0yERcoJADmYmIiCTB0CMTcUxPNcf0EBERSYGhRyYebOkhIiKSFEOPTGxjeq5yTA8REZEkGHpk4u3aGHquVNXJXBMiIqLBgaFHJkPdtQCAS5UMPURERFJg6JGJj1tj6Cm7ZobVKshcGyIiooGPoUcm3m6N3VsWq4CrnMFFRETU67oVelJTUxEYGAidTofw8HCcOHGi3bJ5eXmIiYlBYGAgFAoFUlJSOjz3pk2boFAosGrVKrv9tbW1iI+Ph7e3N9zc3BATE4OSkhK7MgUFBYiOjoaLiwuGDRuG5557Dg0NDd25xV7npFJiSNO4nrJrDD1ERES9zeHQs3fvXiQkJGDt2rXIycnB5MmTERUVhdLS0jbLV1dXY/To0di0aRMMBkOH587KysKOHTswadKkVsdWr16NgwcPYt++fTh69CiKiorw8MMPi8ctFguio6NhNptx7NgxvPvuu3jnnXeQmJjo6C1KxqeptYfjeoiIiCQgOCgsLEyIj48Xv1ssFsHPz09ISkrq9HdHjRolvP76620eq6ysFMaOHSukp6cLM2fOFFauXCkeKy8vF5ycnIR9+/aJ+3744QcBgJCZmSkIgiB8/PHHglKpFIxGo1hm27Ztgl6vF+rq6rp0bxUVFQIAoaKiokvlr9ejb2UKo54/JOzPKZTkekRERANRV/9+O9TSYzabkZ2djcjISHGfUqlEZGQkMjMzryt8xcfHIzo62u7cNtnZ2aivr7c7Nm7cOIwcOVK8bmZmJiZOnAhfX1+xTFRUFEwmE/Ly8tq8Zl1dHUwmk90mpaFunMFFREQkFYdCT1lZGSwWi12wAABfX18YjcZuVyItLQ05OTlISkpq87jRaIRGo4Gnp2e71zUajW3Wy3asLUlJSfDw8BC3gICAbt9Dd3DaOhERkXRkn71VWFiIlStXYvfu3dDpdJJee82aNaioqBC3wsJCSa/fcto6ERER9S61I4V9fHygUqlazZoqKSnpdJBye7Kzs1FaWoqpU6eK+ywWC7788ku8+eabqKurg8FggNlsRnl5uV1rT8vrGgyGVrPIbPVsr25arRZarbZb9e4JbOkhIiKSjkMtPRqNBtOmTUNGRoa4z2q1IiMjAxEREd2qwOzZs3Hq1Cnk5uaKW2hoKGJjY5GbmwuVSoVp06bBycnJ7rpnzpxBQUGBeN2IiAicOnXKbhZZeno69Ho9goODu1W33sbQQ0REJB2HWnoAICEhAXFxcQgNDUVYWBhSUlJQVVWFJUuWAAAWL16MESNGiONzzGYz8vPzxc8XL15Ebm4u3NzcEBQUBHd3d0yYMMHuGq6urvD29hb3e3h4YOnSpUhISMCQIUOg1+vxzDPPICIiArfccgsAYM6cOQgODsbjjz+O1157DUajES+++CLi4+Nlbc3piK1769I1hh4iIqLe5nDoWbBgAS5duoTExEQYjUZMmTIFhw8fFgcNFxQUQKlsbkAqKipCSEiI+D05ORnJycmYOXMmjhw50uXrvv7661AqlYiJiUFdXR2ioqLwl7/8RTyuUqlw6NAhPPXUU4iIiICrqyvi4uLw8ssvO3qLkrG19FypMqPeYoWTSvYhVkRERAOWQhAEvvipiclkgoeHByoqKqDX63v9ehargBtf/AQWq4Dja2bD4CHtQG4iIqKBoKt/v9m0ICOVUgGDvjHoXCyvkbk2REREAxtDj8xGeDkDAC5crZa5JkRERAMbQ4/M/MXQw5YeIiKi3sTQIzN/LxcADD1ERES9jaFHZv7s3iIiIpIEQ4/MbKHnIlt6iIiIehVDj8wCbN1b5TWwWrl6ABERUW9h6JGZwUMHpQIwN1hRxpWZiYiIeg1Dj8ycVEoM92js4ipkFxcREVGvYejpA7hWDxERUe9j6OkDuFYPERFR72Po6QO4Vg8REVHvY+jpA7hWDxERUe9j6OkDbKGn8ApDDxERUW9h6OkDgoa6AQAKrlSjtt4ic22IiIgGJoaePmCouxaeLk6wCsDPl67JXR0iIqIBiaGnD1AoFLhxmDsA4MeSSplrQ0RENDAx9PQRNxoau7jOGNnSQ0RE1BsYevqIm3wbW3p+YksPERFRr2Do6SNubAo9Zxh6iIiIegVDTx9hCz0XrtbgWl2DzLUhIiIaeBh6+ggvVw2GuWsBsIuLiIioNzD09CE3GWzjejiYmYiIqKcx9PQhY4dxXA8REVFvYejpQ25qmrbOtXqIiIh6HkNPHyLO4DIy9BAREfU0hp4+ZKyvOxQKoLSyDmXX6uSuDhER0YDC0NOHuGnV4iKF35y/InNtiIiIBhaGnj5meuAQAMDX5xh6iIiIehJDTx8z/YbG0JPFlh4iIqIexdDTx4Q1tfTkF5lQWVsvc22IiIgGDoaePsbgocPIIS6wCkD2r1flrg4REdGAwdDTB9nG9bCLi4iIqOcw9PRBYTd4AQCyzrGlh4iIqKcw9PRBYTd4AwByC8tRW2+RuTZEREQDQ7dCT2pqKgIDA6HT6RAeHo4TJ060WzYvLw8xMTEIDAyEQqFASkpKqzLbtm3DpEmToNfrodfrERERgU8++UQ8fv78eSgUija3ffv2ieXaOp6WltadW5RVoLcLfNy0MFusOHmhQu7qEBERDQgOh569e/ciISEBa9euRU5ODiZPnoyoqCiUlpa2Wb66uhqjR4/Gpk2bYDAY2izj7++PTZs2ITs7G9988w1mzZqFBx98EHl5eQCAgIAAFBcX223r16+Hm5sb5s6da3euXbt22ZV76KGHHL1F2SkUiuYuLo7rISIi6hEOh54tW7Zg2bJlWLJkCYKDg7F9+3a4uLhg586dbZafPn06Nm/ejIULF0Kr1bZZ5v7778e9996LsWPH4sYbb8SGDRvg5uaG48ePAwBUKhUMBoPdduDAATzyyCNwc3OzO5enp6ddOZ1O5+gt9gm2qevHf7ksc02IiIgGBodCj9lsRnZ2NiIjI5tPoFQiMjISmZmZPVIhi8WCtLQ0VFVVISIios0y2dnZyM3NxdKlS1sdi4+Ph4+PD8LCwrBz504IgtDuterq6mAymey2viJijA+AxpWZuV4PERH1J7X1Fpwrq8K/zpbh/W8K8Xr6j3hu33eI/e/jOPy9UbZ6qR0pXFZWBovFAl9fX7v9vr6+OH369HVV5NSpU4iIiEBtbS3c3Nxw4MABBAcHt1n27bffxs0334xbb73Vbv/LL7+MWbNmwcXFBZ999hmWL1+Oa9euYcWKFW2eJykpCevXr7+ueveWG33dMGaoK36+VIX0/BI8PNVf7ioRERFBEARcqTKjqLwWF8trUFReI/5s/Fzb4UuzwwK9cc+Etoe79DaHQk9vuummm5Cbm4uKigp88MEHiIuLw9GjR1sFn5qaGuzZswcvvfRSq3O03BcSEoKqqips3ry53dCzZs0aJCQkiN9NJhMCAgJ66I6uj0KhwP2T/ZDy+U84+F0RQw8REUnC3GCFsaIWF8qrUVRe2xhkrtagqKI53NTWWzs9j7OTCiO8nOHn6YwRnjr4eThjhJczJvl79v5NtMOh0OPj4wOVSoWSkhK7/SUlJe0OUu4qjUaDoKAgAMC0adOQlZWFP//5z9ixY4dduQ8++ADV1dVYvHhxp+cMDw/HK6+8grq6ujbHE2m12nbHGfUF901qDD3/91MZyqvN8HTRyF0lIiLqxwRBQEVNPS7agkx5DYoqau2+X7pWhw5GhoiGumvh5+kMf09n+HnqmsKNs/jT08UJCoWi92/KAQ6FHo1Gg2nTpiEjI0OcFWW1WpGRkYGnn366RytmtVpRV9e6eeztt9/GAw88gKFDh3Z6jtzcXHh5efXpYNORoGFuuHm4Hj8Um3D4eyMWho2Uu0pERNSH1VsaW2kaw0xjkLnY1Fpj64aqNne+/ptWrbQLMH5NwWaEZ2NrjcFDB61aJcEd9SyHu7cSEhIQFxeH0NBQhIWFISUlBVVVVViyZAkAYPHixRgxYgSSkpIANA5+zs/PFz9fvHgRubm5cHNzE1t21qxZg7lz52LkyJGorKzEnj17cOTIEXz66ad21z579iy+/PJLfPzxx63qdfDgQZSUlOCWW26BTqdDeno6Nm7ciGeffdbRW+xT7ps0HD8Um3DoZDFDDxHRIFdRUy8GmKLyGlworxG7oIrKa1BiqoW1C600Pm6axiDj0RRsvJq6oJoCjrerps+10vQEh0PPggULcOnSJSQmJsJoNGLKlCk4fPiwOLi5oKAASmXzpLCioiKEhISI35OTk5GcnIyZM2fiyJEjAIDS0lIsXrwYxcXF8PDwwKRJk/Dpp5/i7rvvtrv2zp074e/vjzlz5rSql5OTE1JTU7F69WoIgoCgoCBxen1/dv8kP2z+9AyO/VyGS5V1GOreP1utiIioYw0WK0or61oNDm7sdmoMNpV1DZ2eR6NSit1Nts2/RWuNn6czdE79r5WmJyiEjuZ0DzImkwkeHh6oqKiAXq+XuzqiB9/8Ct9dqMArD47H4xGBcleHiIi64Vpdgxhi7Gc7NYYao6kWli4003i5OLUaP2NrrfHz1MHHVQulcuC10nSkq3+/+8zsLWrf/ZP98N2FChz8rpihh4ioD7JYBVxqo5WmqLwGF5oGCJtqO2+lUSsVGG6b6SQGmZbhRgcXDf90dxefXD9w78Th+H//+wNOnL+C4ooaDPdwlrtKRESDSrW5QVyDpqjFTKeLTQOGjRW1qLd03krj4ezUPIXbbpBw4+eh7lqoBlkrjZQYevoBP09nTA/0Qtb5q9h9vADPRt0kd5WIiAYMq1VAWVWd3diZi79prbla3fnK+CqlAga9TmyR8fNsOUjYGcM9dHDXOUlwR9Qehp5+Yulto5F1PhvvHDuPf7/9Bq7ZQ0TURQ0WK4oranHhag0uXK3GhaYxNbYF94rLa2G2dL7YnptW3aLLqbmlxtZaM8xdC7XK4VdakoQYevqJOcG+4po9b391Dv/fHLb2EBEBjeNpjKZaXLhSjcIWwcb2s7ii8wHCSgXgq9fZdTWN+E1rjZ6tNP0eQ08/oVQqsHL2WDz5XjZ2/es8lt7G1h4iGhwsVgElJvuWmsIrTcGmvBrF5bVo6CTUaFRKjPByhn/TJrbYNK1TY/DQwYmtNAMeQ08/wtYeIhqIrFYBpZV1uHC1GoVXq3HhSo0YaGwznzobJOykUsDP0xkBXi5isPEXP7tgmPvgm8ZNrTH09CONrT1BePK9HLb2EFG/YbUKuHStrkW3U2OLTeGVxp9FXRhTo1Y2hpqWgSZgSHOwGeau46wn6hRDTz8zJ9iAcQZ3nDZWYudX55DA1h4ikpkg2EJNi26npmBz8WrjqxLMDR2HGpVSgeEeuhYtNS1abIa4wKBnqKHrx9DTzyiVCqyKHCu29vwbW3uIqJcJgoCya+bWLTUtgk1dJ6FGqQCGe9h3OwUMaQ42Br2OM5+o1zH09EMtW3v++//Ocd0eIrougiDgSpW5saXmNzOfbJ9r6zsPNQa9Dv5DWrfUBHi5cKAw9QkMPf1Qy9aeHV/+jLuDfTE5wFPuahFRHyUIAq5W19tN5baNp7EFm5p6S4fnUNhCjW08zW8GChs8dNCoGWqob2Po6aeixhtwz3gDDucZEb8nB/+74nZ4OHMNCaLBSBAEVNTU/2ZMjX1LTZW581Dj665rNfPJ1gU13MOZoYb6PYaefkqhUODVeZOQV1yBwis1eP6Dk9j22FQoFBzoRzQQ1dZbcOFqNQquNLbSFF5pnN5t+1xZ1/nLLIe5a38zlqb5p5+nDlq1SoI7IZIPQ08/5uHshNRHpyJm2zEczjPi3WPn8fsZN8hdLSLqBturEmzr1BSKAadxwPClyrpOz+HjprWbxm0bT+Pf9KZunRNDDQ1uDD393CR/T/zx3pux/mA+Nn58GlNHeWGSv6fc1SKi3xAEAZerzGKIKRQDTWNrTVF5TaerCrtr1fAf0jieJmCIC0YOaVyrpjHYuMBZw1BD1BGGngHg97cG4vgvl/FpXgni9+Tg0DMc30Mkh2t1DS3CjG18TWOLzYWrNajuZFxNy1clNAYaFwQ0LcI3cogLPJyd2IVNdB0YegYAhUKB1+ZNRl7R/6HwSg1e+PAk/hLL8T1EPc3cYEVReY3YOlNwxfbahMaQc6XK3OHv22ZABXi5wL+phaZli42vu46vSiDqRQpBEDpuTx1ETCYTPDw8UFFRAb1eL3d1HPZdYTnmbT+GeouAf5txA/4UfTNXMCVygO11CYVXWgwYvlotzogqrqhBJz1Q8HRxEltnmltqGrukRng5c7AwUS/o6t9vtvQMIJMDPLHugfH404HvsfNf53DhajVSFk6Bi4b/zEQ2FTX1rcbTiC02Vzt/XYLOSQl/r6bWGXEmVHPI0evYtUzUV/Gv4QATGz4K7jonPLvvO3yWX4KF/3Uc/x0XimHuOrmrRiSJGrMFF8vtW2lafjbVdjy1W6mA+LZu2yDhkd7NwWaom5Zdx0T9FEPPAPTAZD/4eeiw7K/f4OSFCvwu9Rh2/n46bjK4y101ouvWclyNbTG+wharDJdd68rUbk1TiHHByBZjawK8XDDck69LIBqoOKanhf4+pue3zpdV4d/eycIvZVVw16rxl8em4vaxQ+WuFlGHLFYBxRU19oGmaUxN4dVqGE216Oy/Wrap3bZ1auxbbJzZ5Us0wHT17zdDTwsDLfQAwNUqM/7wXjZOnLsClVKB//fQBCwKGyl3tWgQs1oFlF2rE8fT2FpobC03XVmvxjauJqDF6sK21hp/L2dO7SYaZBh6umEghh4AqGuw4IUPT+HAtxcBANEThyNhzo0YM9RN5prRQGR7uWVhi9aZlp+7MljYSaXACE/71yW0DDc+bhqGGiISMfR0w0ANPUDjH6KUz3/CG1/8BEEAVEoF5k31x8rIsfDzdJa7etTPmGrrxVcltHzBpa3lprOXWyoVwHAPZ/GVCbYuKNtg4WHuOi63QERdxtDTDQM59Nj8UGxC8qdnkHG6FACgUSvx+C2jsPzOMfB208pcO+oLBEHAlSozisprcbG8cW2aovKaxkDTNCuqoqa+0/P46rXtdkEZPDhYmIh6DkNPNwyG0GPzzfkreO3TMzhx7goAwFWjwtLbR2PZ7TfAneuMDGjV5gYUldeKYeZieS2Ky2tQVFGDovJaFJXXoK6T7icAGOKqQYCX828GDDd+HsGXWxKRhBh6umEwhR6g8f/ov/ypDJs/PY3vL5oAAF4uTlh+ZxDmh/rD00Ujcw3JURargNLKWvsw0/S5qKnV5mp15600ADDMXQs/T2f4eeoau6J+M7bGVcsZUETUNzD0dMNgCz02VquAw3lGJH92Br9cqgLQOOZi2igv3DVuGGaNG4abfN05cFRmgiDAVNNg1+XUMswUldfCaKqFpbP3JABw06rh56lrCjXO8PNo/jzC0xm+eh00anY/EVH/wNDTDYM19Ng0WKzYn3MRb391DmdKKu2OjfB0xl3jhmLWuGGIGO0DZw27LnqS1SqgvKYeZdfqcKmyDsUVzV1OYrApr+l0gDAAqJUKGDx08PNwtg82LT7zVQlENJAw9HTDYA89LV24Wo1/ni7FF6dLcezny3ZjPLRqJW4d441Z44bhrnHD4O/lImNN+y5bkLlUWYeya3VioLl0rQ5llWa7fVeqzJ2uTWMzxFXTGGA8WocZPw9nDHXXcuYTEQ0qDD3dwNDTthqzBZm/lCHjh1L883Qpiipq7Y77eegw0rvxBYwjh9iW9nfBKG9XeLkMrEXirFYBV6vNKLtmbjfI2ELO5Spzl7qaWvJ0cYKPmxYGva45zLQIN8M9nNnKRkT0Gww93cDQ0zlBEHCmpBJfnC7FFz+UIqfgKjr6u+6mVYvvNxo5xAUjvV3FcDTcQwetWilJKBIEAWaLFdV1FlSZG1BttjRudQ2oMltQbW5AVV3jz2pzU5k6C6rqGlBWZUZZDwSZoW5a+Lhr4eOmafzu3rTPTQsfdw28XbUcR0NE1A0MPd3A0OO4iup6nL10DYVXqlFg2y43/jSaajs/ARrXCtKolHBSKaBRK+GkUrbYp2zap4BGrYJGpWixr/GnWqlAbb0FVWYLasyNQcUuuJgbUGO2dLn7qCu8moKMT1OQGdoUXGzhZqh747EhrhoGGSKiXtbVv9+cc0rXxcPFCdNGeWHaKK9Wx2rrLbhwtQYFV6qaglANCq5UiwGppr5xUK65wdrpawl6klathKtWDWcnFVy1Krho1M0/NSq4aNVwcWr86apRYYirpjnYuGnh7abhwnpERP1Qt0JPamoqNm/eDKPRiMmTJ2Pr1q0ICwtrs2xeXh4SExORnZ2NX3/9Fa+//jpWrVplV2bbtm3Ytm0bzp8/DwAYP348EhMTMXfuXLHMnXfeiaNHj9r93h/+8Ads375d/F5QUICnnnoK//znP+Hm5oa4uDgkJSVBrWa2k4POSYWgYW4IGtb6HV+26ddmixVmixX1DY0/zQ1W1Is/BZgtFpgbhBb7WpYTYG6wosFqhc5JBReNCq4aNVy0TT81jUFG/K5VwcVJBTUDCxHRoORwGti7dy8SEhKwfft2hIeHIyUlBVFRUThz5gyGDRvWqnx1dTVGjx6N+fPnY/Xq1W2e09/fH5s2bcLYsWMhCALeffddPPjgg/j2228xfvx4sdyyZcvw8ssvi99dXJpnDVksFkRHR8NgMODYsWMoLi7G4sWL4eTkhI0bNzp6m9TLFAoFPFw4bZqIiKTj8Jie8PBwTJ8+HW+++SYAwGq1IiAgAM888wxeeOGFDn83MDAQq1atatXS05YhQ4Zg8+bNWLp0KYDGlp4pU6YgJSWlzfKffPIJ7rvvPhQVFcHX1xcAsH37djz//PO4dOkSNJrOVxfmmB4iIqL+p6t/vx1q5zebzcjOzkZkZGTzCZRKREZGIjMzs/u1bcFisSAtLQ1VVVWIiIiwO7Z79274+PhgwoQJWLNmDaqrq8VjmZmZmDhxohh4ACAqKgomkwl5eXltXquurg4mk8luIyIiooHJoe6tsrIyWCwWu2ABAL6+vjh9+vR1VeTUqVOIiIhAbW0t3NzccODAAQQHB4vHH330UYwaNQp+fn44efIknn/+eZw5cwb79+8HABiNxjbrZTvWlqSkJKxfv/666k1ERET9Q58Z4XvTTTchNzcXFRUV+OCDDxAXF4ejR4+KweeJJ54Qy06cOBHDhw/H7Nmz8fPPP2PMmDHduuaaNWuQkJAgfjeZTAgICLi+GyEiIqI+yaHuLR8fH6hUKpSUlNjtLykpgcFguK6KaDQaBAUFYdq0aUhKSsLkyZPx5z//ud3y4eHhAICzZ88CAAwGQ5v1sh1ri1arhV6vt9uIiIhoYHIo9Gg0GkybNg0ZGRniPqvVioyMjFbjb66X1WpFXV1du8dzc3MBAMOHDwcARERE4NSpUygtLRXLpKenQ6/X23WTERER0eDkcPdWQkIC4uLiEBoairCwMKSkpKCqqgpLliwBACxevBgjRoxAUlISgMbBz/n5+eLnixcvIjc3F25ubggKCgLQ2M00d+5cjBw5EpWVldizZw+OHDmCTz/9FADw888/Y8+ePbj33nvh7e2NkydPYvXq1bjjjjswadIkAMCcOXMQHByMxx9/HK+99hqMRiNefPFFxMfHQ6vVXv+TIiIion7N4dCzYMECXLp0CYmJiTAajZgyZQoOHz4sDhouKCiAUtncgFRUVISQkBDxe3JyMpKTkzFz5kwcOXIEAFBaWorFixejuLgYHh4emDRpEj799FPcfffdABpbmD7//HMxYAUEBCAmJgYvvviieF6VSoVDhw7hqaeeQkREBFxdXREXF2e3rg8RERENXnz3Vgtcp4eIiKj/6ZV1eoiIiIj6K4YeIiIiGhQYeoiIiGhQYOghIiKiQaHPrMjcF9jGdPMdXERERP2H7e92Z3OzGHpaqKysBAC+ioKIiKgfqqyshIeHR7vHOWW9BavViqKiIri7u0OhUPTouW3v9SosLOR0+F7E5ywNPmdp8DlLg89ZGr35nAVBQGVlJfz8/OzWCvwttvS0oFQq4e/v36vX4Du+pMHnLA0+Z2nwOUuDz1kavfWcO2rhseFAZiIiIhoUGHqIiIhoUGDokYhWq8XatWv58tNexucsDT5nafA5S4PPWRp94TlzIDMRERENCmzpISIiokGBoYeIiIgGBYYeIiIiGhQYeoiIiGhQYOghIiKiQYGhRwKpqakIDAyETqdDeHg4Tpw4IXeV+rWkpCRMnz4d7u7uGDZsGB566CGcOXPGrkxtbS3i4+Ph7e0NNzc3xMTEoKSkRKYaDwybNm2CQqHAqlWrxH18zj3j4sWLeOyxx+Dt7Q1nZ2dMnDgR33zzjXhcEAQkJiZi+PDhcHZ2RmRkJH766ScZa9z/WCwWvPTSS7jhhhvg7OyMMWPG4JVXXrF7QSWfc/d8+eWXuP/+++Hn5weFQoG///3vdse78lyvXLmC2NhY6PV6eHp6YunSpbh27VqP15Whp5ft3bsXCQkJWLt2LXJycjB58mRERUWhtLRU7qr1W0ePHkV8fDyOHz+O9PR01NfXY86cOaiqqhLLrF69GgcPHsS+fftw9OhRFBUV4eGHH5ax1v1bVlYWduzYgUmTJtnt53O+flevXsWMGTPg5OSETz75BPn5+fjP//xPeHl5iWVee+01vPHGG9i+fTu+/vpruLq6IioqCrW1tTLWvH959dVXsW3bNrz55pv44Ycf8Oqrr+K1117D1q1bxTJ8zt1TVVWFyZMnIzU1tc3jXXmusbGxyMvLQ3p6Og4dOoQvv/wSTzzxRM9XVqBeFRYWJsTHx4vfLRaL4OfnJyQlJclYq4GltLRUACAcPXpUEARBKC8vF5ycnIR9+/aJZX744QcBgJCZmSlXNfutyspKYezYsUJ6erowc+ZMYeXKlYIg8Dn3lOeff1647bbb2j1utVoFg8EgbN68WdxXXl4uaLVa4W9/+5sUVRwQoqOjhX/7t3+z2/fwww8LsbGxgiDwOfcUAMKBAwfE7115rvn5+QIAISsrSyzzySefCAqFQrh48WKP1o8tPb3IbDYjOzsbkZGR4j6lUonIyEhkZmbKWLOBpaKiAgAwZMgQAEB2djbq6+vtnvu4ceMwcuRIPvduiI+PR3R0tN3zBPice8pHH32E0NBQzJ8/H8OGDUNISAjeeust8fi5c+dgNBrtnrOHhwfCw8P5nB1w6623IiMjAz/++CMA4LvvvsNXX32FuXPnAuBz7i1dea6ZmZnw9PREaGioWCYyMhJKpRJff/11j9aHb1nvRWVlZbBYLPD19bXb7+vri9OnT8tUq4HFarVi1apVmDFjBiZMmAAAMBqN0Gg08PT0tCvr6+sLo9EoQy37r7S0NOTk5CArK6vVMT7nnvHLL79g27ZtSEhIwB//+EdkZWVhxYoV0Gg0iIuLE59lW/8d4XPuuhdeeAEmkwnjxo2DSqWCxWLBhg0bEBsbCwB8zr2kK8/VaDRi2LBhdsfVajWGDBnS48+eoYf6tfj4eHz//ff46quv5K7KgFNYWIiVK1ciPT0dOp1O7uoMWFarFaGhodi4cSMAICQkBN9//z22b9+OuLg4mWs3cLz//vvYvXs39uzZg/HjxyM3NxerVq2Cn58fn/Mgwu6tXuTj4wOVStVqNktJSQkMBoNMtRo4nn76aRw6dAj//Oc/4e/vL+43GAwwm80oLy+3K8/n7pjs7GyUlpZi6tSpUKvVUKvVOHr0KN544w2o1Wr4+vryOfeA4cOHIzg42G7fzTffjIKCAgAQnyX/O3J9nnvuObzwwgtYuHAhJk6ciMcffxyrV69GUlISAD7n3tKV52owGFpN7mloaMCVK1d6/Nkz9PQijUaDadOmISMjQ9xntVqRkZGBiIgIGWvWvwmCgKeffhoHDhzAF198gRtuuMHu+LRp0+Dk5GT33M+cOYOCggI+dwfMnj0bp06dQm5urriFhoYiNjZW/MznfP1mzJjRasmFH3/8EaNGjQIA3HDDDTAYDHbP2WQy4euvv+ZzdkB1dTWUSvs/eSqVClarFQCfc2/pynONiIhAeXk5srOzxTJffPEFrFYrwsPDe7ZCPTosmlpJS0sTtFqt8M477wj5+fnCE088IXh6egpGo1HuqvVbTz31lODh4SEcOXJEKC4uFrfq6mqxzJNPPimMHDlS+OKLL4RvvvlGiIiIECIiImSs9cDQcvaWIPA594QTJ04IarVa2LBhg/DTTz8Ju3fvFlxcXIT33ntPLLNp0ybB09NT+Mc//iGcPHlSePDBB4UbbrhBqKmpkbHm/UtcXJwwYsQI4dChQ8K5c+eE/fv3Cz4+PsJ//Md/iGX4nLunsrJS+Pbbb4Vvv/1WACBs2bJF+Pbbb4Vff/1VEISuPdd77rlHCAkJEb7++mvhq6++EsaOHSssWrSox+vK0COBrVu3CiNHjhQ0Go0QFhYmHD9+XO4q9WsA2tx27dollqmpqRGWL18ueHl5CS4uLsLvfvc7obi4WL5KDxC/DT18zj3j4MGDwoQJEwStViuMGzdO+K//+i+741arVXjppZcEX19fQavVCrNnzxbOnDkjU237J5PJJKxcuVIYOXKkoNPphNGjRwt/+tOfhLq6OrEMn3P3/POf/2zzv8lxcXGCIHTtuV6+fFlYtGiR4ObmJuj1emHJkiVCZWVlj9dVIQgtlqMkIiIiGqA4poeIiIgGBYYeIiIiGhQYeoiIiGhQYOghIiKiQYGhh4iIiAYFhh4iIiIaFBh6iIiIaFBg6CEiIqJBgaGHiIiIBgWGHiIiIhoUGHqIiIhoUPj/AeD4pxhDzdBkAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.plot(alphas, test_scores)\n",
    "plt.title(\"Alpha vs CV Error\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "可见，大概alpha=10~20的时候，可以把score达到0.135左右。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Random Forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestRegressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "max_features = [.1, .3, .5, .7, .9, .99]\n",
    "test_scores = []\n",
    "for max_feat in max_features:\n",
    "    clf = RandomForestRegressor(n_estimators=200, max_features=max_feat)\n",
    "    test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=5, scoring='neg_mean_squared_error'))\n",
    "    test_scores.append(np.mean(test_score))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(max_features, test_scores)\n",
    "plt.title(\"Max Features vs CV Error\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用RF的最优值达到了0.137"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 5: Ensemble\n",
    "\n",
    "这里我们用一个Stacking的思维来汲取两种或者多种模型的优点\n",
    "\n",
    "首先，我们把最好的parameter拿出来，做成我们最终的model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ridge = Ridge(alpha=15)\n",
    "rf = RandomForestRegressor(n_estimators=500, max_features=.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestRegressor(max_features=0.3, n_estimators=500)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestRegressor</label><div class=\"sk-toggleable__content\"><pre>RandomForestRegressor(max_features=0.3, n_estimators=500)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestRegressor(max_features=0.3, n_estimators=500)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ridge.fit(X_train, y_train)\n",
    "rf.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面提到了，因为最前面我们给label做了个log(1+x), 于是这里我们需要把predit的值给exp回去，并且减掉那个\"1\"\n",
    "\n",
    "所以就是我们的expm1()函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_ridge = np.expm1(ridge.predict(X_test))\n",
    "y_rf = np.expm1(rf.predict(X_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一个正经的Ensemble是把这群model的预测结果作为新的input，再做一次预测。这里我们简单的方法，就是直接『平均化』。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_final = (y_ridge + y_rf) / 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 6: 提交结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "submission_df = pd.DataFrame(data= {'Id' : test_df.index, 'SalePrice': y_final})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们的submission大概长这样："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1461</td>\n",
       "      <td>119461.756032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1462</td>\n",
       "      <td>150770.931821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1463</td>\n",
       "      <td>174683.021591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1464</td>\n",
       "      <td>189602.816877</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1465</td>\n",
       "      <td>195393.693781</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1466</td>\n",
       "      <td>175995.184462</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1467</td>\n",
       "      <td>177294.435928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1468</td>\n",
       "      <td>169038.846048</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1469</td>\n",
       "      <td>183953.298116</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1470</td>\n",
       "      <td>123407.958012</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Id      SalePrice\n",
       "0  1461  119461.756032\n",
       "1  1462  150770.931821\n",
       "2  1463  174683.021591\n",
       "3  1464  189602.816877\n",
       "4  1465  195393.693781\n",
       "5  1466  175995.184462\n",
       "6  1467  177294.435928\n",
       "7  1468  169038.846048\n",
       "8  1469  183953.298116\n",
       "9  1470  123407.958012"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "submission_df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "走你~"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
